Java接受第三方的post请求

本文详细介绍了在使用SpringMVC框架处理POST请求时遇到的中文乱码问题及其解决方法。通过对比直接返回Map集合与转换为JSON字符串后的编码差异,揭示了乱码产生的根本原因,并提供了有效的解决策略。

最近用到第三方接口,就是一个另一个接口向我们发送httpPost请求,我们接受数据,然后返回给他们成功或失败

话不多说,直接上代码
注意1、我们接受请求,通常都是用数据流,来接受,这里直接用了springMVC的@RequestBody,它可以将请求体中的数据直接转为string字符串,这就直接拿到数据了。单数如果是get请求是没有请求体的,这时直接将该注解去掉即可。
注意2、在我处理完数据返回信息的时候,又出现了问题,我将返回的信息封装在map集合里,然后将map集合转换为jsonString,然后我用postMain测试,返回结果中中文乱码,显示编码方式为ISO-8859-1,原因并不奇怪,应为字符串没有经过任何的处理。但是如果我直接将map集合返回,不转为字符串,也不经过任何的处理,那么postmain收到的数据中中文是不会乱码的。原因就在于如果直接返回map,那么会默认将map解析为json数据,此时转为json的时候默认编码方式为UTF-8.查看postMain果然显示也是UTF-8编码。于是问题的到解决。

  //请求方式:POST请求,Content-Type:application/json;charset=utf-8,
    @RequestMapping("/insertArticle.do")
    @ResponseBody
    public Map insertArticle(@RequestBody String json, HttpServletRequest request,HttpServletResponse response)throws Exception{

        //  这里如果是get请求,将@RequestBody去掉。因为get请求没有请求体(body)
        //  RequestBody:将http请求中的body中的数据拿到,并转换为String格式的数据
        
      JSONObject jsonObject = JSON.parseObject(json);
        HashMap<String, Object> resultMap = isFalse(jsonObject);
        if(ipFilter(request)){
            if((Boolean)resultMap.get("success")){ // 文章存在,各个参数值正确
                Article article = new Article();
                String articleID = jsonObject.getString("articleID");
                String columnID = jsonObject.getString("columnID");
                Boolean crawlPic = Boolean.valueOf(jsonObject.getString("crawlPic")); // 是否抓取图片

                Column column = columnService.getColumnById(Integer.valueOf(columnID).intValue());
                article.setArticleSiteId(column.getSiteId());

                String content = "";
                String imgUrl = "";
                // 如果需要抓取图片,就将原文中的图片下载下来,保存到本地服务器,并将原文中的地址替换为本地地址
                if(crawlPic){
                     content = ImageHunter.catchImages(jsonObject.getString("content"), column.getSiteId().toString());
                     imgUrl = ImageHunter.loadToStorage(jsonObject.getString("imgUrl"), column.getSiteId().toString());
                }else{  // 不抓取图片,就将图片中地址域名给替换掉
                    content = domainNameReplace(jsonObject.getString("content"));
                    imgUrl = domainNameReplace(jsonObject.getString("imgUrl"));
                }

                // 设置参数
                article.setArticleColumnId(Integer.valueOf(columnID).intValue());
                article.setArticleTitle(jsonObject.getString("title"));
                article.setArticleType(Short.valueOf(jsonObject.getString("articleType")).shortValue());
                article.setSysModifyUser(jsonObject.getString("optUser"));
                article.setArticleStatus(Short.valueOf(jsonObject.getString("status")).shortValue());
                article.setArticleContent(content);
                article.setArticleSubTitle(jsonObject.getString("subTitle"));
                article.setArticleLeadTitle(jsonObject.getString("leadTitle"));
                article.setArticleAbstract(jsonObject.getString("abstract"));
                article.setArticleSource(jsonObject.getString("source"));
                article.setArticleTag(jsonObject.getString("tag"));
                article.setArticleAuthor(jsonObject.getString("author"));
                article.setArticleEditor(jsonObject.getString("editor"));
                article.setArticleLiability(jsonObject.getString("liability"));
                article.setArticlePicBig(imgUrl);
                article.setArticleWordCount(Long.valueOf(SensitiveWordsFilterUtils.trimHtml2Txt(article.getArticleContent()).length()));
                jsonObject.getString("author");
                jsonObject.getString("editor");
                jsonObject.getString("liability");
                jsonObject.getString("imgUrl");

                if(Long.valueOf(articleID).longValue() == 0 ){
                    // 新建
                    articleService.insertSelective(article); // 该方法内有新建articlePub的操作
                    resultMap.put("articleID",article.getId());
                }else{
                    // 更新:更新g_article_pub_lib表中,所有articleId 为articleID的数据
                    article.setId(Long.valueOf(articleID).longValue());
                    articleService.updateSelective(article);

                    ArticlePubExample example = new ArticlePubExample();
                    example.createCriteria().andArticleIdEqualTo(Long.valueOf(articleID));
                    List<ArticlePub> articlePubs = pubService.listByExample(example);
                    for(ArticlePub artPub :articlePubs){
                        artPub.setArticleId(Long.valueOf(articleID).longValue());
                        artPub.setArticleSiteId(Long.valueOf(article.getArticleSiteId()));
                        artPub.setArticleTitle(article.getArticleTitle());
                        artPub.setArticleType(article.getArticleType());
                        artPub.setSysModifyUser(article.getSysModifyUser());
                        artPub.setArticleStatus(article.getArticleStatus());
                        artPub.setArticleAbstract(article.getArticleAbstract());
                        artPub.setArticleSource(article.getArticleSource());
                        artPub.setArticleEditor(article.getArticleEditor());
                        artPub.setArticlePicBig(imgUrl);
                        artPub.setColumnId(Integer.parseInt(columnID));
                        pubService.updateSelective(artPub);
                    }
                }
            }

        }else{
            HashMap<String ,Object> result = new HashMap<>();
            result.put("success",false);
            result.put("msg","该ip无权访问此接口,请联系管理员配置接口白名单");
            return result;
        }
        return resultMap;
    }


### 如何使用Java发送POST请求调用第三方API 为了实现向第三方API发送POST请求的功能,在Java中有多种方法可以选择。一种常见的方式是利用`HttpURLConnection`类来构建HTTP请求并处理响应。另一种更简洁高效的选择则是采用Apache HttpClient库或是OkHttp这样的现代HTTP客户端。 下面展示了一个基于`HttpURLConnection`的例子: ```java import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class PostExample { public static void main(String[] args) throws Exception { String url = "https://api.example.com/resource"; URL obj = new URL(url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); // 设置基本属性 con.setRequestMethod("POST"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); // 发送POST请求需设置如下两行 con.setDoOutput(true); // POST 请求参数 String urlParameters = "param1=value1&param2=value2"; // Send post request try(OutputStream os = con.getOutputStream()) { byte[] input = urlParameters.getBytes("utf-8"); os.write(input, 0, input.length); } int responseCode = con.getResponseCode(); System.out.println("Response Code : " + responseCode); con.disconnect(); } } ``` 对于更加复杂的场景,比如需要支持异步操作、自动重试机制等功能,则建议考虑引入像Apache HttpClient或OkHttp这类成熟的开源项目[^1]。 当涉及到OAuth认证流程时,如果服务提供商采用了OAuth协议作为其安全措施的一部分,那么还需要特别注意获取临时授权码以及验证状态参数的过程以确保安全性[^2]。 另外值得注意的是,在企业级应用环境中,通常会通过云平台的服务控制策略(SCP)来管理对外部API访问权限的配置,这有助于保障整个系统的稳定性和安全性[^3]。 最后,虽然这里讨论的重点是如何在Java中发起POST请求,但如果目标是在自动化社交网络互动方面有所建树的话,也可以参考Python结合Twitter API的相关实践案例[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值