使用Java的URL/HttpURLConnection進行遠程調用(POST請求)


利用Java的HttpURLConnection進行遠程url請求(調用遠程接口)
測試類:請求類型為json,以post方式請求,利用OutputStream寫入數據
實體類:
public class User implements Serializable {

    private String name;
    private String password;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
-------
@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot02ApplicationTests {

    @Autowired
    private UserService userService;

    @Test
    public void contextLoads(){
        User user = new User();
        user.setName("lisi");
        user.setPassword("123");
        //調用遠程接口方法,獲取返回結果類型
        String result = userService.idendifyUser(user);
        System.out.println(result);
    }
}
---------
@Service
public class UserServiceImpl implements UserService {
    
    public String idendifyUser(User user){
        //將對象轉換為json,然后發送;
        String json = JSONObject.fromObject(user).toString();
        String result = null;
        try {
            result = UserRemoteVerify.doPost(json);
        }catch (Exception e){
            e.printStackTrace();
        }
        return result;
    }
}
---------
/**
 * 調用遠程接口,驗證用戶數據是否合理
 */
public class UserRemoteVerify {

    //post請求
    public static String doPost(String json) throws  Exception{
        //創建URL對象,設置請求url
        URL url = new URL("http://127.0.0.1:8089/user/service");
        //調用URL對象的openConnection( )來獲取HttpURLConnection對象實例
        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        //請求方法為POST
        conn.setRequestMethod("POST");
        //設置連接超時為5秒
        conn.setConnectTimeout(5000);
        //允許輸入輸出
        conn.setDoInput(true);
        conn.setDoOutput(true);
        //不能緩存
        conn.setUseCaches(false);
        //至少要設置的兩個請求頭
        //設置頭部信息
        conn.setRequestProperty("headerdata", "ceshiyongde");
        //一定要設置 Content-Type 要不然服務端接收不到參數
        conn.setRequestProperty("Content-Type", "application/Json; charset=UTF-8");
        //輸出流包含要發送的數據,要注意數據格式編碼
        OutputStream op=conn.getOutputStream();
        op.write(json.getBytes());
        //服務器返回東西了,先對響應碼判斷
        String result = null;
        if (conn.getResponseCode() == 200) {
            //用getInputStream()方法獲得服務器返回的輸入流
            InputStream in = conn.getInputStream();
            //流轉換為二進制數組,read()是轉換方法
            byte[] data = new byte[1024];
            in.read(data);
            result= new String(data, "UTF-8");
            in.close();
            return result;
        }
        return result;
    }

}
-------------
遠程服務端代碼
@Controller
public class UserController {

    /**
     * 使用json接收客戶端請求,返回json數據;url="http://127.0.0.1:8089/user/service"
     */
    @PostMapping("user/service")
    @ResponseBody
    public String dealUserForJson(HttpServletRequest request)throws Exception{
        //調用處理服務,對遠程數據進行校驗,返回對應的結果
        String result = UserRemoteHandle.verifyUser(request);
        return result;
    }
}
--------
/**
 * 處理遠程數據驗證
 */
public class UserRemoteHandle {

    /**
     * 驗證遠程用戶信息,若正確,則返回成功;否則返回失敗
     */
    public static String  verifyUser(HttpServletRequest request) throws Exception{
        //根據HttpServletRequest獲取輸入流對象
        InputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
            //使用byte[]數組存儲接收到的數據
            byte[] bytes = new byte[1024];
            //從輸入流中將數據讀取到bytes中
            inputStream.read(bytes);
            //將bytes轉換為字符串類型
            String json = new String(bytes);
            //int i = 1/0;  //服務端異常測試
            if(StringUtils.isNotBlank(json)){
                JSONObject jsonObject = JSONObject.fromObject(json);
                //將json類型轉換為對象
                User user = (User)JSONObject.toBean(jsonObject,User.class);
                //判斷用戶名和密碼是否正確;假設用戶名:lisi,密碼:123;
                if(user.getName().equals("lisi") && user.getPassword().equals("123")){
                    return "success";
                }
            }
        }catch (Exception e){
            e.printStackTrace();
            return "服務端出現異常";

        }finally { //釋放資源
            if(inputStream != null){
                inputStream.close();
            }
        }
        //數據不符,返回錯誤信息
        return "message is error";
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM